package data_structure

import scala.collection.mutable.ListBuffer

object TestList {
  def main(args: Array[String]): Unit = {
    testList()
    testVector()
    // List 和 Vector 都是不可变的，其包含的对象一旦确定就不能增加和删除

    testListBuffer()
  }

  def testList(): Unit = {
    var strList = List("BigData", "Hadoop", "Spark")
    // 显示指定元素类型
    val l = List[Double](1, 3, 4)
    // head: 列表第一个元素的值
    // tail: 除第一个元素外的其他值构成的新列表
    println(s"strList head: ${strList.head}, tail: ${strList.tail}")

    val otherList = "Apache" :: strList
    println(s"otherList: $otherList")
    // 利用空列表对象Nil以及“右结合”规则操作符初始化一个列表
    val intList = 1 :: 2 :: 3 :: 4 :: Nil
    println(s"intList: ${intList}")
    // 针对列表，按索引访问的操作都需要从头开始遍历，时间复杂度是线性时间O(N)
    println(s"第4个元素是：${intList(3)}")
  }

  def testVector(): Unit = {
    // 向量（Vector)
    val vecl = Vector(1, 2)
    // 使用 +: 向序列的前端添加新元素
    val vecl2 = 3 +: 4 +: vecl
    // 使用 :+ 向序列的尾端添加新元素
    val vecl3 = vecl2 :+ 5
    println(s"vecl3第4个元素是：${vecl3(3)}")
    println(s"vecl3：${vecl3}")
  }

  def testListBuffer(): Unit = {
    // 初始长度为3的可变列表
    val mutableL1 = ListBuffer(10, 20, 30)
    mutableL1 += 40
    println(s"mutableL1: $mutableL1")

    // 在列表尾部增加一个元素50， 并返回这个新列表，原列表保持不变
    val mutableL2 = mutableL1 :+ 50
    // 从第2个索引位置开始，插入60
    mutableL1.insert(2, 60)
    mutableL1.insert(2, 40)
    println(s"mutableL1: $mutableL1")
    // 在数组中删除值为40的第一个元素
    mutableL1 -= 40
    // 移除索引为2的元素，并将其返回
    var temp = mutableL1.remove(2)
    println(s"mutableL1: $mutableL1")

    // 注意：+= 方法会修改列表本身，而+:只是利用当前列表创建一个新的列表
    // 对于可变序列，包含“=”的方法都会直接修改序列本身
  }
}
